/**
 * 
 */
package semantico;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

import sintatico.*;
/**
 * @author rifiorelli
 *
 */

public class Semantico {

	StringBuffer programaOutput;
	
	public Semantico(){
		programaOutput = new StringBuffer();
	}
	

	public void fazerAcaoSemantica(int est) {
		switch(est){
		    case Estados._1_RECEBE_I:
		    	geraCodigo("	entra('I');");
		    	geraCodigo("	tenta_reduzir();");
		    	break;
		    case Estados._2_RECEBE_K:
		    	geraCodigo("	entra('K');");
		    	geraCodigo("	tenta_reduzir();");
		    	break;
		    case Estados._4_RECEBE_S:
		    	geraCodigo("	entra('S');");
		    	geraCodigo("	tenta_reduzir();");
		    	break;
		    case Estados._6_RECEBE_0:
		    	geraCodigo("	entra('0');");
		    	geraCodigo("	tenta_reduzir();");
		    	break;
		    case Estados._7_RECEBE_1:
		    	geraCodigo("	entra('1');");
		    	geraCodigo("	tenta_reduzir();");
		    	break;
		    case Estados._8_RECEBE_CRASE:
		    	geraCodigo("	entra('`');");
		    	geraCodigo("	tenta_reduzir();");
		    	break;
		    case Estados._9_RECEBE_ASTERISCO:
		    	geraCodigo("	entra('*');");
		    	geraCodigo("	tenta_reduzir();");
		    	break;
		    case Estados._10_RECEBE_ABRE_PARENTESES:
		    	geraCodigo("	abre_escopo();");
		    	break;
		    case Estados._15_RECEBE_FECHA_PARENTESES:
		    	geraCodigo("	fecha_escopo();");
		    	geraCodigo("	tenta_reduzir();");
		    	break;
		}
	}

	private void geraCodigo(String string) {
		programaOutput.append(string);
		programaOutput.append("\n");
	}


	public void inicioPrograma() {
		geraCodigo("#include <stdio.h>");
		geraCodigo("#include \"vm.h\"");
		geraCodigo("int main(void) {");
		geraCodigo("");
	}
	

	public void terminoPrograma(){
		geraCodigo("	imprime();");
		geraCodigo("	return 0;");
		geraCodigo("");
		geraCodigo("}");
		geraCodigo("");
	}
		
	public void montarMaravilhosaSaidaC() {
		terminoPrograma();
		System.out.println("********************************************************************");
		System.out.println("O Arquivo final esta assim: ");
		System.out.println(programaOutput);
		System.out.println("********************************************************************");
		
		File progFile = new File("programas/resultado_cadeia.c");
		Writer output = null;
		try {
			// use buffering
			// FileWriter always assumes default encoding is OK!
			output = new BufferedWriter(new FileWriter(progFile));
			output.write(programaOutput.toString());
		} catch (Exception ex) {
			ex.printStackTrace();
		} finally {
			// flush and close both "output" and its underlying FileWriter
			if (output != null)
				try {
					output.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
		}
	}

}
